package com.dd.controller;

import com.dd.model.PublicSupervisionData;
import com.dd.service.PublicDataService;
import javafx.collections.FXCollections;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Alert;
import javafx.scene.control.ComboBox;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.stage.Stage;

import java.net.URL;
import java.util.Arrays;
import java.util.List;
import java.util.ResourceBundle;
/*`PublicDataAssignController` 是 JavaFX 应用中的一个控制器类，主要用于“公众监督数据指派”页面的数据展示和交互。它的主要功能包括：

1. **数据显示**：  
   通过 `setPublicSupervisionData` 方法，将选中的公众监督数据（如编号、提交日期、地址、省、市、问题类型、严重程度、描述、当前状态等）显示在界面上。

2. **指派网格员和更改状态**：  
   - 可以从下拉框中选择要指派的网格员（`assignWorkerComboBox`）。
   - 可以更改该条数据的处理状态（`newStatusComboBox`）。

3. **保存与更新**：  
   点击“保存”按钮后，会将指派的网格员和新的状态保存到数据对象，并通过 `PublicDataService` 更新到数据源（如数据库或文件）。保存成功会弹窗提示并关闭窗口，失败会弹窗报错。

4. **取消操作**：  
   点击“取消”按钮会直接关闭当前窗口，不做任何更改。

---

**总结**：  
这个类就是“公众监督数据指派页面”的控制器，负责显示公众监督数据详情，支持管理员或相关人员为该数据指派网格员、修改处理状态，并保存更新。
*/
public class PublicDataAssignController implements Initializable {

    @FXML
    private Label idLabel;
    @FXML
    private Label submitDateLabel;
    @FXML
    private Label specificAddressLabel;
    @FXML
    private Label provinceLabel;
    @FXML
    private Label cityLabel;
    @FXML
    private Label problemTypeLabel;
    @FXML
    private Label severityLabel;
    @FXML
    private TextArea descriptionTextArea;
    @FXML
    private Label currentStatusLabel;

    @FXML
    private ComboBox<String> assignWorkerComboBox;
    @FXML
    private ComboBox<String> newStatusComboBox;

    private PublicDataService publicDataService;
    private PublicSupervisionData selectedData;

    public PublicDataAssignController() {
        publicDataService = new PublicDataService();
    }

    @Override
    public void initialize(URL url, ResourceBundle resourceBundle) {
        List<String> gridWorkers = publicDataService.getAllGridWorkers();
        assignWorkerComboBox.setItems(FXCollections.observableArrayList(gridWorkers));

        List<String> statuses = Arrays.asList("已提交", "已指派", "已处理", "待处理");
        newStatusComboBox.setItems(FXCollections.observableArrayList(statuses));
    }

    // 将方法名从 setData 修改为 setPublicSupervisionData
    public void setPublicSupervisionData(PublicSupervisionData data) { // <--- 这里修改
        this.selectedData = data;
        idLabel.setText(data.getId());
        submitDateLabel.setText(data.getSubmitDate());
        specificAddressLabel.setText(data.getSpecificAddress());
        provinceLabel.setText(data.getProvince());
        cityLabel.setText(data.getCity());
        problemTypeLabel.setText(data.getProblemType());
        severityLabel.setText(data.getSeverity());
        descriptionTextArea.setText(data.getProblemDescription());
        currentStatusLabel.setText(data.getStatus());

        assignWorkerComboBox.getSelectionModel().select(data.getAssignedGridWorker());
        newStatusComboBox.getSelectionModel().select(data.getStatus());
    }

    @FXML
    private void handleSave() {
        if (selectedData != null) {
            String selectedWorker = assignWorkerComboBox.getSelectionModel().getSelectedItem();
            String selectedStatus = newStatusComboBox.getSelectionModel().getSelectedItem();

            // 注意：如果 selectedWorker 或 selectedStatus 可能是 null (用户没有选择)，
            // 并且 PublicSupervisionData 的 setter 不接受 null，
            // 或者 PublicDataService 在处理 null 时会报错，需要在这里添加null检查。
            // 例如：
            // if (selectedWorker == null) { selectedWorker = ""; }
            // if (selectedStatus == null) { selectedStatus = ""; }

            selectedData.setAssignedGridWorker(selectedWorker);
            selectedData.setStatus(selectedStatus);

            boolean success = publicDataService.updatePublicData(selectedData);

            if (success) {
                showAlert(Alert.AlertType.INFORMATION, "保存成功", "数据已更新。");
                Stage stage = (Stage) idLabel.getScene().getWindow();
                stage.close();
            } else {
                showAlert(Alert.AlertType.ERROR, "保存失败", "无法更新数据。");
            }
        }
    }

    @FXML
    private void handleCancel() {
        Stage stage = (Stage) idLabel.getScene().getWindow();
        stage.close();
    }

    private void showAlert(Alert.AlertType alertType, String title, String message) {
        Alert alert = new Alert(alertType);
        alert.setTitle(title);
        alert.setHeaderText(null);
        alert.setContentText(message);
        alert.showAndWait();
    }
}
